# -*- coding:utf8 -*-
from ext import db

# from sqlalchemy.exc import SQLAlchemyError

tags = db.Table(
    'post_tags',
    db.Column('post_id', db.Integer, db.ForeignKey('post.id')),
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)


class User(db.Model):
    """
    作者表
    """
    id = db.Column(db.Integer(), primary_key=True)
    username = db.Column(db.String(255))
    password = db.Column(db.String(255))
    # db.relationship函数在SQLAlchemy中创建了一个虚拟的列，它会和我们的Post对象中的db.ForeignKey建立联系。
    # backref 在关系的另一个模型中添加反向引用
    # dynamic关联对象会在被使用的时候再加载，并且在返回前进行过滤，如果数据多，变化多久采用这种方式。
    posts = db.relationship("Post", backref='user', lazy='dynamic')

    def __init__(self, username):
        self.username = username

    def __repr__(self):
        # formats what is shown in the shell when print is
        # called on it
        return '<User {}>'.format(self.username)


class Post(db.Model):
    """
    博客文章表
    """
    id = db.Column(db.Integer(), primary_key=True)
    title = db.Column(db.String(255))
    text = db.Column(db.Text())
    publish_date = db.Column(db.DateTime())
    # db.relationship函数在SQLAlchemy中创建了一个虚拟的列，它会和我们的Post对象中的db.ForeignKey建立联系。
    # backref 在关系的另一个模型中添加反向引用
    # dynamic关联对象会在被使用的时候再加载，并且在返回前进行过滤，如果数据多，变化多久采用这种方式。
    comments = db.relationship("Comment", backref="post", lazy="dynamic")
    # 外健约束，保证每个Post对象都会对应一个已有的user
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id'))
    tags = db.relationship('Tag', secondary=tags, backref='posts')

    def __init__(self, title):
        self.title = title

    def __repr__(self):
        return "<Post '{}'>".format(self.title)


class Comment(db.Model):
    """
    用户评论表
    """
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(255))
    text = db.Column(db.Text())
    date = db.Column(db.DateTime())
    post_id = db.Column(db.Integer(), db.ForeignKey('post.id'))

    def __repr__(self):
        return "<Comment '{}'>".format(self.text[:15])


class Tag(db.Model):
    """
    标签表
    """
    id = db.Column(db.Integer(), primary_key=True)
    title = db.Column(db.String(255))

    def __init__(self, title):
        self.title = title

    def __repr__(self):
        return "<Tag '{}'>".format(self.title)
